Hi Yannik,
This is quite a broad question - but I'll do my best to answer it in summary :)
The protocol works via a pull from the grid nodes. They request work from the client routinely in order to fill up their own local processors. The work requests are a round robin between all connected clients, which allows processing power to be shared fairly evenly between multiple connections.
When work is requested by a grid node, the client will make the choice as to which task is appropriate for the node. This takes into account activities, exclusively used resources, etc. If no work is available, the client simply returns a 'work request rejected' message.
At present there is no intelligence regarding the physical performance of the individual nodes. NCrunch doesn't yet know which nodes are faster/slower or more appropriate for certain types of tests, unless you disclose this via the capablities.
I hope this helps. Are you experiencing problems with your grid?
Cheers,
Remco