マージソートの良くない実装の様な気がする。
データ列を二分割するたびにlistをいちいち用意しないように
poolは一つだけで、門番keeperを用意すれば良いのでは無いか?

発射(弾を作りたくなった)
pool[keeper++].init();

消滅
// idxに消滅イベントがおきた弾のインデクスを入れる
pool[idx]=pool[--keeper];

表示
for(i=0;i<keeper;i++)draw(pool[i]);

これはジョークに近いけど書いておく
DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, keeper*modelhasVertex , 0, keeper * modelhasTriang );