<p>And on top of that, are there cases where one has to use the global assembly cache or where one cannot use it?</p>

In all my life, I have had maybe one application where I had to put an assembly in the GAC, simply because these assemblies were part of a framework that a number of applications would use it, and it seemed right to put them into the GAC.