I did extensive research on this for mamehooker and since I seem to be battling a bout of insomnia yet again tonight I'll try to fill you guys in.
Xinput controllers are also direct input controllers. So you'll be able to use a Xinput controller on most older games no problem. The thing is Xinput controllers do NOT support force-feedback, they support xinput rumble, which is a far simplier protocol.
So a lot of people seem to think the issue is Xinput and it's drivers... it isn't. The problem is the direct input descriptor's lack of force-feedback support.
I wish we could track down Headkaze, he's good at this stuff. What we need is a fake joystick that shows up with force-feedback support.... that fake joystick could in turn send a rumble command to a xinput joystick when ff commands are sent to it.
Now on to XBCD....
Eh it works, but it's not super great. It doesn't have a driver signature so it's difficult to get it to install properly on vista or beyond. Once you get it installed you'll find that it's third party controller support is rather lacking and that obviously it has broken support for all the games that DO support xinput.
Now while installing 360ce on top of this might be a solution, remember you are now emulating a DI device by translating a XI device and then emulating a XI device and translating the already emulated DI device. Talk about lag.
For the record xinput is inherently quicker in terms of packet transmission and response time. So any lag you've experienced in a particular game is probably due to bad coding more than anything else. XI works a bit differently. While with DI you can setup a message callback to tell you when a input has changed, with XI you need to manually poll the joystick in your main game loop. So if your main game loop is setup poorly....well there you go.
Oh also some other stuff. It IS possible to read the status of the guide button but it's rather hackish. The xinput1_3.dll has a few unlabeled api calls. If you first load the xinput1_3.dll via a "load library" call to get the address of the dll and then get the address of the unnamed function via calling get process address and sending the ordinal 100 as the message you'll finally stumble upon the address of the unnamed function.
Call this address like you would XinputGetState and you'll get the same data back, except now the status of the guide button is sent back in the report with a bitmask of 0x400.
I haven't have much luck with this (probably because vb has an issue with this sort of trickery... need to switch to c) but there are ahk scripts and some helper apps out there floating around.
I hope some of that is useful. Guess I'll try to sleep again.... (UGH!).