Интерфейсы нужны для того, чтобы с вашими собственными классами могли работать другие классы.
Например, вы реализовали собтсвенную коллекцию объектов со своей странной логикой. Допустим, вы хотите, чтобы по этой коллекции можно было бы пройтись циклом foreach, но изначально фрейморк понятия не имеет, каким образом осуществлять итерацию объектов внутри вашей коллекции. Вот тогда вы заявляете, что ваш класс реализует интерфейс IEnumerable, и предоставляет наружу реализацию этого интерфейса. Вот тогда фреймворк уже знает, как можно перебрать все элементы коллекции.
IEnumerable реализует и массив и список и словарь и связный список, то есть для того, чтобы вы могли пройтись по какому-либо классу при помощи foreach, этот класс обязан реализовывать IEnumerable. Считайте интефейс это "соглашение о сотрудничестве" между разными классами, в котором чётко определены правила взаимодействия.