Сейчас на работе заставляют писать на WPF, но чтобы не забыть WinForms, буду рассматривать реализацию одних и тех же задач и в той, и в другой технологии.
Переопределение стандартных элементов управления
Как правило, стандартных элементов управления вполне хватает, чтобы написать приложение с UI. Если вдруг хочется сделать интерфейс нестандартным, то можно взять чужую библиотеку элементов, например DevExpress.
Но доработка стандартных контролов не такая уж и сложная вещь. Вполне по силам сделать и самому. Чем и предлагаю заняться. Реализую самое простое, что приходит в голову: чекбокс с нестандартным отображением.
CheckBox на WinForms
Здесь один способ. Надо реализовать свой класс:
class MyCheckBox: CheckBox { protected override void OnPaint(PaintEventArgs e) { // рисуем фон, текст, графику } }

CheckBox на WPF
В нашем распоряжение имеется уже два способа.
Первым идет дедовский способ:
class MyCheckBox: CheckBox { protected override void OnRender(DrawingContext dc) { //рисуем программно, аналогично WinForms } }
Второй вариант – переопределить шаблон элемента:
<Checkbox Template="{StaticResource myCheckBox}"/> <Controltemplate x:Key="myCheckBox" TargetType="CheckBox"> <Border>…</Border> <ControlTemplate.Triggers>…</ControlTemplate.Triggers> </ControlTemplate>

Собственно вкратце это все. Исходные коды примера.
Во второй части буду рассматривать написание составных элементов.