1. в MemoryCache есть понятие Expiration(Времяжизни куска данных). Т.е. вы задаете условно сколько по времени хранить данный объект в кеше. Зависит от ваших задач. Допустим 5 минут.
Задаете 5 минут, для объекта кладете его в MemoryCache методом Add.
При получении делаете Get - если объект не истек по времени, вернется объект, если истек - получите null - проверяете на null - получаете данные по старинке, снова задаете Expiration - и снова делаете Add.
Если вам надо принудительно очистить - делаете Remove.
Также есть метод AddOrGetExisting - он как бы объединяет логику и упрощает код.
2. Чтобы писать из разных потоков нужно писать самому реализацию. Вот пример -
MemCache.cs
4. Реализации оберток над MemoryCache есть, не могу что-либо порекомендовать. Но в гугле/github'е находятся. Изучайте.