まとめ

IDisposableを実装するクラスに求められる最低限度の機能は、
好きなタイミングで明示的にDispose()を呼び出して、アンマネージリソースを解放するということだけ。
この最低限度の実装しかしていないクラスなら、Dispose()は絶対に呼ばなきゃいけない。

でもこれじゃ、もしDispose()を呼び出すのを忘れた場合に、
アンマネージリソースは解放されずに残ってしまう。

そこで安全弁として、まともなクラス(FCLなど)では、
Finalize経由でもDispose(bool disposing)を呼び出してリソースの解放が行われるようになっている。

そういうクラスでは別に明示的にDispose()を絶対に呼び出さなきゃいけないわけではない。