Not tested (no real test data) but the first part of your question could probably be done with a single query like this:-
SELECT d.vID, d.vName, GROUP_CONCAT(e.gName) AS SharedGenre, COUNT(*) AS SharedGenreCount
FROM videos a
INNER JOIN genre_connections b
ON a.vID = b.gcVideoID
INNER JOIN genre_connections c
ON b.gcGenreID = c.gcGenreID
AND b.gcVideoID != c.gcVideoID
INNER JOIN videos d
ON c.gcVideoID = d.vID
INNER JOIN genres e
ON c.gcGenreID = e.gID
WHERE a.vName = 'Iron Man'
GROUP BY d.vID, d.vName
ORDER BY SharedGenreCount DESC
LIMIT 6
For the 2nd part, to match up on similar names, I am not sure how usable it will be. For example, if you search for Dexter do you really want Dexters Laboratory returned? Similarly searching for Aliens on a simple match on name wouldn't find Alien.
I would suggest you possibly need another table to link up a series of films.