I think the docs are pretty clear about what IDisposable is good for.
The primary use of this interface is
to release unmanaged resources. The
garbage collector automatically
releases the memory allocated to a
managed object when that object is no
longer used. However, it is not
possible to predict when garbage
collection will occur. Furthermore,
the garbage collector has no knowledge
of unmanaged resources such as window
handles, or open files and streams.
It even has an example. In that example the class that implements IDisposable contains a handle. A handle needs to be freed when it no longer used. This is done in the Dispose() method. So the user of that class sees that it implements IDisposable and knows that the class needs to be explictily disposed when it is no longer needed (so the handle can be freed). It is a best practise (i.e. rule) that you should always call Dispose() on IDisosable instances when the instance is no longer needed.