На часть вопроса я всё таки нашел ответ самостоятельно.
StringFormat не подхватывался, потому что при создании DependencyProperty у свойства "Value" использовался тип object. А StringFormat используется только для типа String. В виду того, что этот компонент нужен мне только для чтения, я поменял typeof(object) на typeof(string) и всё стало работать как нужно.
Нормальным решением это конечно не назовешь. Но как говорил один герой в старом и добром мультфильме: "И так сойдет"
Более подробно об этом написано на
stackoverflow
Насчет isReadOnly - завел для компонента еще одно свойство, аналогично первым двум (value и key). Работает.