Ruby, 118 bytes
c,*a=*$<print" "*l=4,cc.scan(/[^+-.\[\]<>\n]+|./){puts" "*l+$&+" "*(c.size+4-l+=$&.size)+a["><+-.,[]".index($&)||8]}
Explanation
c,*a=*$< # assign 'c' to first line and 'a' to the rest of inputprint" "*l=4,c # output code and assign 'l' to 4 at the same timec.scan(/[^+-.\[\]<>\n]+|./) # for every match:{puts" "*l+$&+" "*(c.size+4-l+=$&.size)+ # output the padded match, update 'l' to keep track of the spacesa["><+-.,[]".index($&)||8]} # output the correct explanation
inspiration taken from lonelyelk