Every time you feel like you need a shortcode to insert an HTML tag, you should ask yourself, what is it you are doing wrong. In this case, you can easily go into the "text" tab and add the div.
The general problem you are facing is that html and the editor support mainly an top to bottom flow. It is hard to make the editor to support any other flow without reaching a state equivalent to having a page builder of sorts, something that no human should be forced to use ;)
The key to a solution is to handle each content area as a different content. Think for example about how widgets work - their content is displayed on the page, but it is not edited with the editor.
So the problem can be reduced to how to edit several content areas in one edit screen and how to "arrange" it in the main post. You can obviously just have a different post which contain that content, or you can add a meta with an editor (call
wp_editor), and assign each content fragment some identifying name. Now all that is left is to have a "multicolounm" short code, give it the identifiers of the content fragments as attributes, and create whatever complex HTML you need.
The drawback for this approach are obvious as it result in a less of a WYSIWYG editing experience (although if wordpress had any front end editing framework it would have easily mitigated that problem), the advantage is that many times this kind of columns are semantically isolated, and this kind of editing structure helps to enforce it.
Hmmmmm, you say your columns are not semantically isolated? maybe (and I say it very quietly) what you need is to just use a table?