The Windows Forms Timer is ultimately limited in resolution to the standard system clock resolution of your computer. This varies from computer to computer, but is generally between 1 ms and 20 ms.
In WinForms, whenever you request a timer interval in code, Windows will only guarantees that your timer will be called no more often then the number of milliseconds specified. It makes no guarantee that your Timer will be called at exactly the milliseconds you specify.
This is because Windows is a time-sharing OS, not real-time. Other processes and threads will be scheduled to run concurrently and so your thread will be forced to wait regularly for usage of the processor. Therefore you shouldn't write WinForms timer code that relies on exact intervals or delays of milliseconds.
In your situation, setting the interval to 1 ms is really just telling Windows to trigger this timer as often as it can. As you have seen this is definitely much less often than 1 ms (60fps = about 17 ms).
If you need a more accurate and higher resolution timer, the Windows API does provide high resolution/performance timers, if your hardware supports it, see How to use the high resolution timer. A drawback of this is that your application CPU usage will be increased to support the higher performance.
Overall I think you're better off implementing a hardware/system independent game loop. That way the perceived animation of your scene appears constant regardless of the actual frame-rate achieved. For more information these articles give a good background.