See the question and my original answer on StackOverflow

Although .NET creates valid type libraries, they are not all supported by VB6. .NET generics cannot be used at all at boundaries.

One solution is to use ArrayList as a collection type usable in C# and VB6 but it's untyped. It works with .NET Framework, but not sure it still works (registered?) with .NET Core3+.

Here is a solution that works and is typed for reading the list, but is untyped for write operations:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("757E6144-FC46-44A0-89DB-B89EF8F75BAB")]
[ProgId("TlbProj.SellProducts")]
public class SellProducts
{
    private readonly List<Product> _products = new List<Product>();

    public SellProducts()
    {
        _products.Add(new Product { EAN = ".NET1234" });
        _products.Add(new Product { EAN = ".NET5678" });
    }

    // read only mode
    public Product[] Products => _products.ToArray();

    // write mode, untyped :-(
    public void SetProducts(object products)
    {
        _products.Clear();
        if (products is IEnumerable enumerable)
        {
            _products.AddRange(enumerable.OfType<Product>());
        }
    }
}

[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("A4292449-4459-42D4-8FB0-18AA0D5FF34A")]
[ProgId("TlbProj.Product")]
[ComVisible(true)]
public class Product
{
    public string EAN { get; set; }
}

VB6 doesn't understand type libs created with object[] or Product[] parameters for SetProducts.