Calling Dispose on an object will usually release any unmanaged resources it has underneath - it does nothing with the Garbage Collector.
I have a blog post about using Dispose:
Calling GC.Collect will fire the garbage collector, but because your myObject reference is not null, your myObject will not be garbage collected.
There are very few places you will likely need to use GC.Collect - I use it when creating add-ins for other applications however, as you are residing in their process.
Objects that are declared in logical scope usually only have the one reference on the stack, as you say. When the stack pops, it will remove this one reference and be elligible for collection.
Dispose is a pattern implemented by .NET for deterministic release of unmanaged resources. It has little to do with the Garbage Collector itself. The GC does not call Dispose on your objects, it calls an object's finalizer - which in certain classes has been used to then call Dispose, as explained in my blog post.