You could use a plugin, but it's pretty easy to do with {if}
statements as well. Here's one of the ways we set this up for a client. There are other's but it was fairly simple.
Problem: Client needed the ability to create various lists that were basically collections of articles from their site or sometimes from other resources. But the lists were occasionally, single-column format, top 10 (in reverse order 10 ->1) top 10 (1-> 10), top 5, bullet list, image as bullet list, etc.
Solution:
- Create a template for each format option. Displayed is a partial list of the various template options.

Added a New Field. In the field_group related to the publish form, we added a new field, with the select template format option.
Create a 'filter' template. The filter template will determine from the post, which display template to use. The code we use looks like
{exp:channel:entries channel="my_channel" limit="1" status="not Closed" require_entry="yes"}
{if no_results}
{redirect="archives/404"}
{/if}
{if series_format=="two_column"}
{embed="series/_two_column"}
{if:elseif series_format=="numbered"}
{embed="series/_numbered"}
{if:elseif series_format=="top_five"}
{embed="series/_top_five"}
{if:elseif series_format=="top_ten"}
{embed="series/_top_ten"}
{if:else}
{embed="series/_single"}
{/if}
{/exp:channel:entries}
The 'filter' template has no styles or other details, but they could. In this case, we left all the formatting on the 'option' templates. We also embedded some secondary stylesheets, to handle reverse count list displays, and the selection of 'image' options, if the selected the bullet as image template.
But otherwise, new template designs can be added at any time. Once the new template is created, we basically update the drop down menu field, which contains the template options, and the 'filter' template that contains the {if}{if:else}
statements.
No plugins required.