このコードで言えば、複数の型のオブジェクトが含まれているコレクションから、その型毎の要素数を数え上げたいと。
Dictionary<Type, int>を使えば数え上げの方は簡単。
Dictionary<Type, int> counts = new Dictionary<Type, int>();
foreach (var type in 型のリスト) counts[type] = 0;
foreach (var item in オブジェクトのコレクション) counts[item.GetType()]++;

> list[i]=(t)"123";
問題はこっち。
"123"はString型だから、勝手に他の型にキャストすることはできない。何らかの方法で型変換を行う必要がある。
たとえば、対象の型がプリミティブ型のみなら、IConvertibleを使うとか。
あるいは、TypeDescriptor.GetConverter(Type)でTypeConverterを取得してConvertFromStringするとか。
逆に型変換さえ行ってしまえば、型情報はオブジェクト自身が持っているから、代入時にキャストする意味はない。全ての基底クラスであるobjectで十分。