In contrast, if you give non-profits money to help the homeless population, the feedback loop is more...ambiguous. If they just blow the money instead of helping anyone, who's gonna complain? The people that should've been helped won't even be aware of some random contract, and are used to different government and private entities failing them anyhow. The lack of clear impact from non-action means it's easier for organizations to get away with doing nothing, or at least doing nothing useful.
Now I'm sure there are some organizations doing great work, but how do you separate them from the grifters?