Why not just keep a reference to the object, so that it doesn't get marked for gc?
In response to your question on how the GC knows it isn't in use anymore:
One way of garbage collecting is keeping a reference count. When the reference count reaches 0, the object isn't referred to anymore, and can be Garbage Collected.
This is not how .NET implements it however (see Garbage Collection) but it might help to understand the principle a bit better.
Edit:
How I understand it, you need a pool of objects that have once been instantiated, and that you can just distribute and collect. Basically you want to implement memory management on top of the GC.
The only reason I can see for wanting to do this is that creating a new instance of the object and making it usable (initializing) takes too much time.
In any case, you could try the traditional unmanaged approach:
Stack pool = new Stack();
// Initialize a few MyObjects
pool.Push( new MyObject() );
// Get an instance of the object from the pool
MyObject obj = (MyObject)pool.Pop();
// Use the object
obj.Foo();
// When you are finished clean up
pool.Push(obj);
obj = null;