Static binary lifting is, in general, undecidable. Actually, correct disassembly is itself undecidable, and binary lifting builds on it. Doing it dynamically, like QEMU/tcg does, is doable.
It's really not too difficult to write a lifter, but it's time consuming. You have to take every instruction from the source instruction set and model its side effects in some IR. To make things simple, "whole binary" lifting tools seem to use a global CPU state (registers, flags, etc...) and so the IR you get is quite different from what you would obtain from a compiled program.