This might not be a locking issue at all: it might be that you are actually trying to add the same key twice.
If you are absolutely sure that this is the only place where new entries are added to the dictionary, this exception could only be caused by:
waypoint
being overwritten by another threadIconCache.LoadIcon
having a nasty side-effect that causes this thread to call this method again.
Step through the code or log what you are adding so you know what is going on.