TabPage version of SelectedIndexChanged
I don't think there is any other way to solve it. By using the  SelectedIndexChanged event and initializing a TabPage you do it just the way it should/can be done.

You may however consider renaming the interface to IInitializable and the method to Initialize which more clearly describes what you are doing. You don't create any tabs, you initialize them so name the interface and the method accordingly.

Internally you can use a boolean field _isInitialized so that the Initialize method checks it and doesn't initialize your tab-page multiple times. Then you just do:

private void OnSelectedIndexChanged(object sender, EventArgs e)
{
    var initializableTabPage = (sender as TabControl).SelectedTab as IInitializable;

    // In case you have other tab-pages.
    if (initializableTabPage != null)
    {
        initializableTabPage.Initialize();
    }        
}


and the tap-page with its interface:

interface IInitializable
{
    void Initialize();
}

class MyTabPage : TabPage, IInitializable
{
    private bool _isInitialized;

    public void Initialize() 
    {
        if (_isInitialized) { return ; }

        ...initialize

        _isInitialized = true;
    }
}





  I find it hard to believe that TabPage does not know when it's selected.
  It looks like it really doesn't:
  TabPage Class Events


You could experimet with GotFocus but it can be tricky. I wouldn't