JavaScript (ES6), 6160 bytes
-1 thanks to @MatthewJensen
Expects a list of 2-character hexadecimal strings.
a=>a.map(s=>(g=k=>k&8g=k=>k--?'':g" X"['0x'+s>>k&1]+g(-~kk)+" X"['0x'+s>>k&1]:'')``(8)).join`
`
Commented
a => // a[] = input array
a.map(s => // for each string s in a[]:
( g = k => // g is recursive function taking a counter k
k-- &? 8 ? // if k is not equal to 8:
0 (decrement it afterwards):
'' " X"[ // stop theappend recursion
either ' ' or 'X':
'0x' + s // else: parse s as a hexadecimal string
g(-~k) + >> k // do a recursiveright-shift callit withby k + 1position
" X"[ & 1 // append either 'and 'isolate orthe 'X':
least significant bit
'0x'] + s // parse// s as a hexadecimal string
end of lookup
>>+ g(k) // append the right-shiftresult itof bya krecursive positioncall
: & 1 // and isolate the least significant bitelse:
] '' // endstop ofthe lookuprecursion
)`` (8) // initial call to g with k zero'ish= 8
).join`\n` // end of map(); join with line-feeds