What is missing from a typical undergraduate program, or not sufficiently emphasized, that a person needs to know for successful employment in a software development position?
To answer your question literally, i would say nothing. I don't necessarily think you need to be the best at TDD or GIT or w/e to be successful in a entry level position. A willingness to learn, some enthusiasm, and a good team fit are (atleast in my experience) huge factors in being successful in an entry level role.
However, to better answer the question. I think dealing with mess is under emphasized. A lot, and i mean a lot of software development is horrendously messy. Seriously. I remember with vivid clarity the look of disgust on an interns face when i told him there are about 60,000 files in the solution he would be working on (so sorry John). To me a good way to get that experience is as others have said: open source. Bonus cool-guy points if you added a feature you needed to a tool you found lacking.