New information about this.
It seems to be more dangerous than I thought.
I ported an app I use a lot to MonoGame from XNA. The app uses a material caching system, so multiple meshes can share materials.
It used to create a new rasteriser state every time the material was applied to the shader. This did not create garbage collection problems in XNA. In MonoGame it made the app unusable.
So I made the rasteriser states part of the material to avoid the garbage issue, and now I cannot render the mesh because I constantly get errors because you cannot modify a rasteriser state after it has been bound to a graphics device.
I tried setting the rasteriser state to a pre-generated default state after each apply of a material, but that made no difference.
I cannot use the trick I used above, because two meshes calling Material.Apply with the same material is perfectly valid. So the old state is the same object as the new state.
I am going to write a work around that builds the rasteriser state in advance, then only changes it when an app setting is changed, but someone needs to look at this.
1) I never had problems with garbage collection before, it's constant now with MonoGame.
2) I never had a binding issue with rasteriser states before.
Something is wrong here. If you can point be at the relevant source code I will have a look for you.
Cheers guys