A partir do manpage do grep:
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
Nesse caso, o -h não funciona.
grep está procurando por cada um dos caracteres: * , ? , < , c , o e m na cadeia de entrada que você canalizou para ela e imprimindo cada um em uma nova linha como se encontra.
$ echo Zcom\?\<\[\*Z
Zcom?<[*Z
$ echo Zcom\?\<\[\*Z | grep -oh "[*?<com]"
c
o
m
?
<
*
$
Além disso, se você usar grep --color -h "[*?<com]" , verá as mesmas letras na mesma ordem destacadas dentro da string de pesquisa ecoada.