Как оптимизировать рисование линий в WPF?
От нескольких тысяч все что угодно будет тормозить
Направление указали уже вам, дополню:
Чтобы не скушать всю оперативу и проц
читайте про BitmapCache 
https://docs.microsoft.com/ru-ru/dotnet/api/system...
и RenderTargetBitmap 
https://docs.microsoft.com/ru-ru/dotnet/api/system...
в UWP кеширование на более верхнем уровне реализовано, там попроще, но в WPF тоже можно сделать хорошо.
Алгоритм вкратце:
2 слоя - верхний -там где тыкаете мышкой
и нижний - кеш
Добавили линию (на верхнем слое) - рендерите в картинку (верх+низ) - отрисовываете эту картинку на нижнем слое (например через ImageBrush), линию на верхнем удаляете.
Т.е. как только пользователь закончил фигуру/действие - кешируете.
Если нужен интерактив на уже нарисованном (например узлы точек подсвечивать), тут сложнее, но тоже возможно (запоминать коодридинаты узлов и при нахождении там мыши - создавать Xaml объект.) 
С интерактивом в подобных алгоритмах как правило много математики.
Т.е. у вас в оперативной памяти всегда 1 картинка + сколько-то объектов - полилиний.
К слову, через кеширование кроме рисования можно делать довольно производительные анимации, производительный зумминг, производительный скролл…
Есть еще вариант: реализовать рисование на DirectX на C++ и поместить контрол. Более нативно и производительнее.
P/S
свойсвто IsHitTestVisible 
https://docs.microsoft.com/ru-ru/dotnet/api/system...
позволяет не реагировать объекту на мышь (т.е. отключает интерактив) это полезно для объектов фона, сильно бустит производительность.
(т.к. по умолчанию WPF определяет все события интерактива на всех объектах, а их может быть бесчисленное множество, и далеко не на всех нужно иметь реакцию на нажатие/OnMouseMove)
Тормозит наверное потому что на on paint перерисовываете все объекты (как минимум при добавлении новой?) Рисуйте линии в битмап однократно и уже его на on paint отрисовывайте.