A quick follow-up on the above, I had forgotten to check for the maximum bounds, so when pre-selecting the last few elements it would look weird.
Replaced with:
float yOffset = m_Value * itemSize.y;
yOffset = Mathf.Clamp(yOffset, 0, contentRectTransform.sizeDelta.y - dropdownRectTransform.sizeDelta.y);
contentRectTransform.anchoredPosition = new Vector2(0, yOffset);