Basically you need to make WordPress treat img like block-level element for the purpose of formatting. Such elements are hardcoded in wpautop() and list is unfortunately not filtered.
What I would do is:
1) Fork wpautop() under different name.
2) Add img to regexp in $allblocks variable.
3) Remove wpautop from the_content filter.
4) Add your forked version to the_content.
You might need to play with priority and possibly remove and re-add other filters if something breaks because of changed processing order.