While other's have showed you how to fix your method, I'll explain what was wrong with your previous one.
The problem with your approach is that your list changes each iteration. So the insertion positions of your elements are relative to the current length of the list. Here is a step through of what you for loop is basically doing:
>>> rev = []
>>> l = len('Hello') - 1
>>> l
4
>>> # first iteration
>>> rev.insert(l, 'H')
>>> rev
['H']
>>> l -= 1
>>> l
3
>>> # second iteration
>>> rev.insert(l, 'e')
>>> rev
['H', 'e']
>>> l -= 1
>>> l
2
>>> # third iteration
>>> rev.insert(l, 'l')
>>> rev
['H', 'e', 'l']
>>> l -= 1
>>> l
1
>>> # fourth iteration
>>> rev.insert(l, 'l')
>>> rev
['H', 'l', 'e', 'l']
>>> l -= 1
>>> l
0
>>> # Fifth iteration
>>> rev.insert(l, 'o')
>>> rev
['o', 'H', 'l', 'e', 'l']
>>> l -= 1
>>> l
-1
>>> # end
As you can see, your insertions position changes based on how the list grows. Sometimes insert behaves like append(), other times it goes back to behaving like insert().
You can fix this problem by making your insertion position 0. That way, you always append to the beginning of the list regardless of how the list changes:
rev.insert(0, c)