Provides an easy mechanism for displaying interactive menus in the CLI.
NuGet PM> Install-Package InteractiveShell
Here's how to setup a basic menu (see DemoProject for more)
// Create a new instance of the ShellMenu class.
InteractiveShell menu = new InteractiveShell();
// Create the options for theming.
ShellDisplayOptions displayOptions = new ShellDisplayOptions()
{
    LeftOffset = 2,
    DisplayHorizontally = false
};
ShellTitleDisplayOptions titleDisplayOptions = new ShellTitleDisplayOptions()
{
    LeftOffset = 2
};
// We will use these fallbacks, notice how we specify `null` for the displayOptions parameters,
// these can be omitted as they are optional parameters but have been explicitly set to null to make the intent clearer.
menu.FallbackDisplayOptions = displayOptions;
menu.FallbackTitleDisplayOptions = titleDisplayOptions;
//
// Single choice menu
//
// Draw the title, clearing the screen beforehand
menu.DrawTitle(title: "Sample Menu", subtitle: "Select a single option:", "Content test", displayOptions: null, clearScreen: true);
// Present the user with the interactive menu
int result = menu.DisplayMenu(options: new string[] { "Option 1", "Option 2" }, displayOptions: null);
switch (result)
{
    case 0:
        // Do Option 1
        break;
    case 1:
        // Do Option 2
        break;
}
//
// Multi-choice menu
//
// Draw the title, clearing the screen beforehand
menu.DrawTitle(title: "Sample Menu", subtitle: "Select multiple options with Control + Enter:", displayOptions: null, clearScreen: true);
// Present the user with the interactive menu
int[] results = menu.DisplayMultiMenu(options: new string[] { "Option 1", "Option 2", "Option 3" }, displayOptions: null);
// Print out the selected indexes
menu.DrawContentText("\nSelected indexes:", false);
foreach (var index in results)
{
    menu.DrawContentText(index.ToString(), false);
}
menu.Reset();
Console.ReadKey();