IIRC there is no easy way to use pointers with managed types - it will introduce issues with memory management for starters.
Under normal conditions any memory allocated from the managed heap can have it's address changed at runtime by the GC, this is transparent to the application though. When dealing with unmanaged memory it needs to be fixed in place and can affect the GC's ability to manage memory efficiently.
If you posted a bit more of the code regarding Neighbours then it may make things clearer.
That said my initial reaction is to ask why you are using pointers in this case anyway - if the structure (SQUARE) is a managed type and it is being called from managed code then I'm struggling to see the benefits of pointers, wouldn't it be easier to store Neighbours either as a managed array or in some other structure like a HashTable or ArrayList? Creating a managed array of pointers seems an unnecessarily complex way of approaching the problem.
Would the following not be suitable
class SQUARE //probably better using a reference type rather than a value type in this case
{
public byte Owner,Units;
public SQUARE[] Neighbors;
public void AddUnit(byte owner)
{
byte i;
this.Units++;
this.Owner = owner;
if(Neighbors.GetUpperBound(0) < Units)
{
Units = 0;
Owner = 0;
for(i=0;i<=Neighbors.GetUpperBound(0);i++)
{
Neighbors[i].AddUnit(owner);
}
}
}
}
and
S[x,y].Neighbors[0] = S[x,y];