How can we change things so more researchers are willing to share their source code?
In the long term, this will only happen if you change the culture (just as you say).  How do you change the culture of a field?  Very slowly, and only with enormous effort.  You talk to other researchers.  You articulate your values, and seek allies who share your values.  You patiently make the case to your fellow colleagues, perhaps by writing opinion pieces.  You don't harangue or attack them; instead, you gently lay out the reasons why it is good for science and good for them to share their code.  Remember, in all likelihood you all share the same common values: the love and dedication of science and the pursuit of truth.

You lead, by acting as a model for how you would like others to behave.  You do what you think is right, and set a good example.

You try to persuade referees and program committees to value and reward researchers who do share their source code.  Recognize the amount of extra effort this takes, and (if you believe it is valuable) reward it accordingly: bump up your rating of their paper correspondingly, and make the case why others to do so.  When you write letters of reference or evaluation for another researcher, if they share their source code, give them kudos and explain why the hiring or promotion committee should view this positively.

Ultimately, this is not something that a single individual can change.  Only the entire community, acting as a whole, can make this kind of change.  Individuals can catalyze and facilitate that change, but like any other kind of reform, it takes extraordinary patience and effort, as well as buy-in from your colleagues.  It's not unusual for this kind of change to take a generation or two.  But keep your chin up: remember, you're doing this because you believe it is good for science and good for your field!