Generics which are private to a type

I'm not sure what you're trying to achieve, but C<T1> and C<T2> have different memory layouts. It's not possible to just lay them bare in an array, and you can not write

let a = Wrapper(proto1) // type Wrapper<X>

// This *should* work from type system perspective,
// but cannot because `Wrapper<T1, X>` and `Wrapper<T2, X>`
// have different layout.
a = Wrapper(proto2) // type Wrapper<X>

That's essentially why you need existential to box T or even C<T>. Hiding information about T doesn't change that fact unless you include type erasure or some kind of boxing mechanism into that hiding process.

If boxing is part of your plan, there are some idea floating around about synthesizing type erasure. You can probably search this forum for that. There's also this thread (Lifting the "Self or associated type" constraint on existentials) that you may be interested in. It's already 2-yr old though, so best not to bump it.