> What is the best practice when it comes to writing classes that might
> have to know about the user interface.

> Wouldn't a class knowing how to draw itself break some best practices
> since it depends on what the user interface is (console, GUI, etc)?

In this case you can still use MVC/MVVM and inject different UI implementations using common interface:

    public interface IAgnosticChartDrawing
    {
       public void Draw(ChartProperties chartProperties);
       event EventHandler ChartPanned;
    }
    
    public class GuiChartDrawer : UserControl, IAgnosticChartDrawing
    {
        public void Draw(ChartProperties chartProperties)
        {
            //GDI, GTK or something else...
        }
        
        //Implement event based on mouse actions
    }
    
    public class ConsoleChartDrawer : IAgnosticChartDrawing
    {
        public void Draw(ChartProperties chartProperties)
        {
            //'Draw' using characters and symbols...
        }
    
        //Implement event based on keyboard actions
    }
    
    IAgnosticChartDrawing guiView = new GuiChartDrawer();
    IAgnosticChartDrawing conView = new ConsoleChartDrawer();
    
    Model model = new FinancialModel();
    
    SampleController controllerGUI = new SampleController(model, guiView);
    SampleController controllerConsole = new SampleController(model, conView);

This way you will be able to re-use your Controller and Model logic while being able to add new types of GUI.