It difficult to be certain what the problem is based on what you posted (I'm still not exactly sure what the two methods are supposed to do) however I noticed one potential problem. You're calling AddRef() after QueryInterface() which usually isn't necessary. QueryInterface() automatically increments the reference count before returning the interface.
Code:
STDMETHODIMP CConnector::Connect(long* User, IFeedback **MyFeedback, IGrid **TheGrid)
{
// TODO: Add your implementation code here
(IID_IGrid, (void**)TheGrid); // <- Reference count incremented
*User = MyGrid.CurrentUser++;
MyGrid.AddRef(); // <- Reference count incremented a second time
MyGrid.Feedbacks[*User].vt = VT_DISPATCH;
MyGrid.QueryInterface
...
Assuming MyGrid is some flavor of smart COM pointer that calls Release() on the interface in the destructor (I don't see its definition) this methods returns without releasing all it's references to the interface. Is this desired?
The same issue occurs in your CGrid::FindDefaultGroup() method.
Try defining _ATL_DEBUG_INTERFACES. Defining it will cause ATL to dump reference count info to the Output window allowing you to trace each call to AddRef() and Release(). It will do this for every interface you implement. For example when MyGrid.QueryInterface() gets called for the first time ATL will output:
1 > CGrid - IGrid
The greater than sign means AddRef() was called. The digit one would be the current reference count. When Release() gets called you should get:
0 < CGrid - IGrid
The less than sign means Release() was called and the digit zero means no more references to that interface exist. All of your interfaces should *eventually* go to zero.