Also ein "Design" Pattern kannes hier ja wenig geben, da hier kein konkretes Design vorliegt.
Ich verstehe allerdings weder, welche Probleme ihr hattet, noch vor welchem Problem ihr steht.
Im Endeffekt funktioniert jedes Update nach:
1) Welche Version bin ich?
2) Welche Version ist die neueste?
3) Update anstoßen.
-> 1 ist super easy, weil mit einem ordentlichen Buildprozess ist die Versionierung teil des Builds und damit teil der Assembly / Exe / Whatever
-> 2 ist super easy, weil Du Dir nur einen Index aufbauen musst, den die Anwendung vergleichen muss. Beispiel .NET SDK:
https://dotnetcli.blob.core.windows.net/...0/releases.json
-> 3 ist individuell wie Deine Anwendung funktioniert
Anwendungsupdates ist ja nicht wirklich eine Raketentechnik.
Ist ja eigentlich relativ einfach und gibt es tausende Wege für; am Ende vom Tag schaust welcher der tausende Wege der anderen Applikationen Deinem ähnelt und baust es nach.
PS: mit WPF hat das Thema wenig am Hut, daher verschoben.