複数の型を取り扱えるように List<T> を継承した、Data<T> クラスを作りました。
次に Data<string> も Data<int> も同一に扱えるように、IData インターフェイスを
つくり Data<T> にかぶせました。

でも、
IData d = new Data<int>();
d.Add(hoge);

ということができませんので、IData インターフェイスに、
void Add(object item);

Data に
public void Add(object item)
{
base.Add((T)item);
}
とメソッドを実装しました。
これで、
IData d = new Data<int>();
d.Add(hoge);
ができるようになってのですが、Add の引数が object なのでキャスト時に
エラーが出ると思います。
もっとスマートな実装は考えられるでしょうか?