From my stackoverflow answer http://stackoverflow.com/a/22251440/360211: An example to back up my comment on how you can use FieldInfo.IsInitOnly
recursively to test for immutability.
There may be more special cases to consider like how I have handled string, but it will only give false negatives I believe, i.e. will tell you something is mutable that is not, not the other way around.
The logic is, every field must be readonly
and be an immutable type itself. Note that it will not cope with self referential types or circular references.