Вы просто создаете свой собственный класс, который наследует элемент управления, который вы хотели бы создать в подклассе. Например:
class BetterButton : Button { ...}
Это легкая часть. Теперь у вас есть возможность переопределять различные методы или свойства, в зависимости от того, чего вы хотите достичь с помощью вашего нового элемента управления. Это может быть что угодно, правда. Одна вещь, которую я часто использую, это переопределение OnPaint, чтобы получить элемент управления, нарисованный пользовательским способом; и все еще получая поведение исходного элемента управления.
В терминах UserControls я часто вижу, что «родительский» UserControl содержит некоторую логику пользовательского интерфейса и базовые элементы пользовательского интерфейса, в то время как подклассы управления являются уточнениями родительского элемента для конкретного использования.