Note that although your question asked for "strings" which collide, MD5 is defined over binary data, so the normal text meaning of "string" doesn't really apply. Languages and libraries which allow you to take the MD5 hash of text data usually mean "encode the string in a specified encoding, then hash the result."

Those are two X.509 certificates of which only the first one was actually signed by the Certificate Authority. The first part is just a header, but the last part (which you will note is the same in the two certificates) is an RSA signature of the MD5 hash of the colliding messages. This means that the second (fake) certificate will validate as having been signed by the Certificate Authority's private RSA key.

This attack involved more than 200 Playstation 3 to prepare the attack and some clever timing on the part of the attackers. For more details see: MD5 considered harmful today.

The most interesting collision I know of is the one used in the Flame espionage malware. Using a different, but similar, technique, an advanced persistent threat (most probably a western intelligence agency) created a fake code signing certificate that claimed to have been signed by Microsoft. See for instance this article. Unfortunately, I don't have access to the actual certificates and the actual MD5-collision.

If the purpose is to demonstrate why or how hash functions result in collisions, and not MD5 specifically, the clearest hash function I know of is simple modular division. Suppose you are storing values in an array of size 10. To find the index to store a particular value x, the index = x % 10. It is obvious that there will be a lot of collisions in this tiny hash table, since for example, 'A' (65) and 'K' (75) will both hash to 5. MD5 can produce 2128 distinct values, so collisions are much less probable but still possible.