Found the problem. It seems that in Unity/Mono, if an interface has a generic method, the 'callvirt' opcode doesn't properly traverse the hierarchy and just takes the first method it finds. So doing this fixed the problem:
void IController.Set<T>()
{
Set<T>();
}
Since, within the method, this
is a class and not an interface, the bug is worked-around.