При рисовании нестандартных элементов управления или изображений обычно используют один из двух подходов: перекрывают метод OnPaint или перехватывают событие Paint.
protected override void OnPaint(PaintEventArgs e) { // тут что-то происходит.... }
или
private void Form_Paint(object sender, PaintEventArgs e) { // тут что-то происходит.... }
Недавно столкнулся с проблемой, что перекрытый метод OnPaint не вызывается, а обработка события Paint не происходит. Поиск в яндексе дал пару похожих проблем, которые несколько лет остаются без решения либо решены окольными путями.