[Br]eaking Code Golf [Ba]d
Python 3, 289 263 bytes

Found a more complete library on Pypi: mendeleev

from mendeleev import*
Z={element(i).symbol for i in range(1,119)}
L,R='[]'
def f(h,r=''):t=h.title();return((Z&amp;{t[0]}and f(h[1:],r+L+t[0]+R)or[])+(Z&gt;{(t+L)[:2]}and f(h[2:],r+L+t[:2]+R)or[])+(not{(r[-1:]+t[0]).title(),t[0]}&amp;Z and f(h[1:],r+h[0])or[]))if h else[r]


Old answer:

from elements import*
Z={e.symbol for e in ELEMENTS}|{*'Cn Ds Fl Lv Mc Nh Og Rg Ts'.split()}
L,R='[]'
def f(h,r=''):t=h.title();return((Z&amp;{t[0]}and f(h[1:],r+L+t[0]+R)or[])+(Z&gt;{(t+L)[:2]}and f(h[2:],r+L+t[:2]+R)or[])+(not{(r[-1:]+t[0]).title(),t[0]}&amp;Z and f(h[1:],r+h[0])or[]))if h else[r]


Uses a library elements.py from http://www.lfd.uci.edu/~gohlke/code/elements.py.html.  It is missing elements 110 to 118, but it was the most up to date library I could find. Cost 40 bytes to add the missing elements.

The trickiest part was the logic for when a character can be passed through without being part of an element symbol.