Arranging arbitrary shapes to fill a rectangular space
Python 2, 434 bytes



lambda s:F([[' ']*sum(map(lambda s:len(s[0]),s)) for _ in' '*sum(map(len,s))],s)
L=len
R=range
def F(a,s):
 if not s:return len(set(tuple(l)for l in a if'X'in l))==len(set(tuple(l)for l in zip(*a)if'X'in l))==1
 c=s[0];h,w=L(c),L(c[0])
 for i in R(L(a)-h):
&#9;for j in R(L(a[0])-w):
&#9; T=1;A=[l[:]for l in a]
&#9; for y in R(h):
&#9;&#9;for x in R(w):
&#9;&#9; C=c[y][x]
&#9;&#9; if C&gt;' ':T&amp;=A[y+i][x+j]&lt;'!';A[y+i][x+j]=C
&#9; r=T and F(A,s[1:])
&#9; if r:return r


Try it online!

Takes input as a list of lists.

Returns True or None

Assumes that each line in a shape is padded to the length of that shape.

(based on my answer to Do the figures fit?)