Another approach might be to take the charity money away from the companies, and have those funds distributed to worthy causes by a democratically appointed body instead: giving the money to causes that benefit everyone, not just the company's PR department. You could call this system 'taxation'.
A case study: Flint water. Nobody's done anything about it for years. Now there's a PR opportunity so Elon's going to fix it. The people of Flint will get drinkable water (hopefully) and Elon will get another PR lift. This problem could have been fixed years ago (and perhaps should never even have happened), but the people who decide when these big social problems get fixed is no longer the people (almost all of whom think it's an unacceptable travesty, especially in a rich, developed nation), but the billionaire class, who require something back in return.