Два варианта: использовать код для генерации графа объекта или использовать XAML.
Сгенерированный код:
1) Компилятор преобразует ваш код в IL
2) Ваш IL интерпретируется во время выполнения CLR
3) Ваш граф объектов создан, когда ваш код выполняет
Сгенерированный XAML (по сути, смесь кода и XAML, составляющих ваш UserControl):
1) Компилятор преобразует часть кода в IL, а XAML - в BAML
2) Ваш IL интерпретируется во время выполнения
3) Ваш класс создан из файла BAML во время выполнения
4) Единороги и магия объединяют два
Вторая версия на самом деле немного медленнее во время выполнения (или я так слышал). Конечно, это большое упрощение процесса, но вы можете видеть, что вторая версия немного сложнее и содержит больше единорога. Но дело в том, что они, с точки зрения пользовательского интерфейса, в значительной степени эквивалентны.
Я думаю, что ваша медлительность может быть вызвана чем-то другим. Возможно, вы действительно видите задержку JIT при первом выполнении, или другие факторы в вашем коде могут быть причиной того, что процесс займет больше времени.
Независимо от того, я бы предложил вам создать свой WPF образ WPF. Используйте привязку, и если вам нужно динамически создать свой пользовательский интерфейс, загляните в ItemsControls и DataTemplates. Это намного проще, чем вы думаете.