Haskell, 235 231 bytes
import Data.Listmain=interact$unlines.map(" "++).f"><+-.,[]".linesf o(i:e)|let t=not.(`elem`o);p=(>>" ").concat;w((c:r):t)=(c:r++p t++'':maybe(e!!8)id(lookup c$zip o e)):[p[c:r]++l|l<-w t];w[]=[]=i:w(groupBy(\x y->t x&&t y)i)
Old answer:
Haskell, 235 bytes
import Data.Listmain=interact$unlines.map(" "++).f.lineso="><+-.,[]"t=not.(`elem`o)p=(>>" ").concatf(i:e)|let w((c:r):t)=(c:r++p t++'':maybe(last e)id(lookup c$zip o e)):[p[c:r]++l|l<-w t];w[]=[]=i:(w$groupBy(\x y->t x&&t y)i)
The answer is not final, will probably be golfed further.