Allow changing the properties of a mutable controller in a thread safe way
Another option is to create ControllerInfo with mutable properties and a Clone method which would return a copy of the instance.

Then on the ControllerInfo Info set, simply call the Clone method and set _info to the clone of the object passed in.

private ControllerInfo _info;

public Info
{
   get { return _info; }
   set { _info = value.Clone(); }
}


To be clearer you can do away with Info as a property and instead code a method

public Controller SetInfo(ControllerInfo info)
{
     _info = info.Clone(); 
     return this;
}


Doing away with "get" semantics for Info, is a good idea, as you do not want the interface to suggest that a get followed by mutating the Info object would reflect the changes in the Controller.