Официально вы должны создать XAML для нового ControlTemplate в виде строки, а затем материализовать его как объект ControlTemplate, используя XamlReader.Parse.
Более структурированный способ сделать это - использовать класс FrameworkElementFactory - создать FrameworkElementFactory и установить ControlTemplate.VisualTree для этого FEF. Это дает вам улучшенную безопасность типов и позволяет избежать трудностей написания дерева объектов, чтобы просто прочитать его снова. Тем не менее, он официально устарел и может стать довольно сложным, если у вас есть сложный шаблон.
См. Как настроить шаблон данных WPF в коде для древовидного представления? для примеров обоих подходов - они написаны в контексте DataTemplate, но будут работать и для ControlTemplate.