既存のコードを極力変更せずに対処してみた

Dictionary<Data.arrow, Block> 互換の辞書クラスを作成
・IDictionary<Data.arrow, Block>を実装

> ArrowDict.cs
・Dictionaryとして使えるが、実態は配列として実装されている
internal class ArrowDict : IDictionary<Data.arrow, Block>
ttp://gamdev.org/up/img/10994.zip
↑実際のコード例(ちょっと手抜き)

> Block.cs
・ArrowDictを使うように修正
// public Dictionary<Data.arrow, Block> arw = new Dictionary<Data.arrow, Block>();
public ArrowDict arw = new ArrowDict();

これでメモリ使用量が激減(117M→10M)して、処理速度が大幅に改善する筈。
これ以上の最適化が必要なら、自分でパフォーマンス計測して頑張ってくださいな。