I would suggest you to use a Layout view, inside this layout you can have a region for each category and draw your composite views on these regions.
the benefit of the Layout view in marionette is that you can pass a template that should contain all the HTML that you need initially, for example a header with buttons to add and remove categories etc.
CategoriesLayout = Backbone.Marionette.Layout.extend({
template: "#layout-template",
regions: {
category1Region: "#category1",
category2Region: "#category2"
}
});;
and then you can render your composite views inside the regions
categoriesLayout = new CategoriesLayout();
categoriesLayout.category1Region.show(new CategoryView());
this way you can show/close your views using the Region functionality. If you need to add the regions on the fly that is also possible if you render the HTML with Marionette.renderer and then attach your regions to the Layout.
additionally you may want to take a look at the region manager of Marionette that helps you to manage a set of regions.
EDIT
I did a jsfiddle to demonstrate this, this is just an example but I think the idea is there...
MyLayout = Backbone.Marionette.Layout.extend({
template: "#layout-template",
regions: {
menu: "#menu",
}
});
var layout = new MyLayout({el:"#container"});
layout.render();
var dynamicRegion = sampleModel.get('categoryName');
layout.addRegion(dynamicRegion,"#dynamic"); // adding the region on the fly
layout[dynamicRegion].show(sampleView); // using it!
so the answer to your question in the comment
categoriesLayout[dynamicRegion].show(new CategoryView())
just make sure the DOM element is there (#dynamic) if its not, just append the HTML on your layout view or use the marionette.Renderer Object to pass a nice template for your region.
And there is no problem adding a region on the fly, marionette has a method for that scenario.
Hope that helps,