Actually, you can. If you run:
foo 2>&1 >&- | grep ...
then you will grep only the stderr. The stdout will be discarded.
Alternatively, if you only want to grep to see the stderr, but you still want to see stdout, you can swap stderr and stdout like this:
foo 3>&2 2>&1 1>&3 | grep ...
And in many shells, you can easily split the stdout and stderr into two separate pipelines like this:
foo > >(grep stdout) 2> >(grep stderr)