Table builder pattern
I'm afraid this is not fully immutable becasue I am able to change the Name with a simple cast:

altTypes.Dump();
((SoilType)altTypes.SensitiveFines).Name = "foo";
altTypes.Dump();


The underlying data type is still SoilType so the interface does not protect the data from being overriden.

Consider a user that writes a function like this one because he doesn't like interfaces :-)

public static void foo(SoilType bar)
{
    bar.Name = "new name";
}


and calls it

foo((SoilType)altTypes.SensitiveFines);
altTypes.Dump();


Name changed. Unfortunatelly I have no idea how to prevent it yet.