In PowerShell è possibile creare delle Windows Form in modo da poter arricchire l'interfaccia utente.
La form e i controlli necessari vanno dichiarati via codice e posizionati sempre via codice, senza il supporto di un designer grafico.
Per questo motivo non è conveniente realizzare form complessi, ma può essere efficace per semplici form.

Si parte creando la Windows Form con la classe Windows.Forms.Form, si creano poi gli altri controlli come button (System.Windows.Forms.Button), label (System.Windows.Forms.Label), ecc...
Da tener presente che tutti i controlli devono essere aggiunti alla collection Controls della form tramite il metodo Add ($form.Controls.Add(...)).

Quando la Windows Form è pronta la posso visualizzare tramite il metodo ShowDialog ($form.ShowDialog()).

L'esempio seguente visualizza la form dell'immagine precedente:
# https://www.sgart.it
# sgart-test-win-form.ps1: esempio di form windows
#--------------------------------------------------------------------------
# aggiungo le reference necessarie per il Windows Form
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# gestisco l'evento click e lo assegno a una "variabile"
$HandleClick = {
    param($obj)

    $now = Get-Date

    Write-Host "Evento: $($obj) - $now"

    # aggiorno il testo della label con l'ora corrente
    $lbl1.Text = "Ora: $now"
}

# creo la Windows Form
$width = 300
$height = 200
$form = New-Object Windows.Forms.Form -Property @{
    StartPosition   = [Windows.Forms.FormStartPosition]::CenterScreen    # imposto la posizione iniziale del form
    Size            = New-Object Drawing.Size $width, $height    # imposto le dimensioni del form
    Text            = "Test windows Form - Sgart.it"    # imposto il titolo della finesta
    Topmost         = $true     # sempre in primo piano
    #MaximizeBox     = $false
    #FormBorderStyle = [Windows.Forms.FormBorderStyle]::FixedSingle
}

# creo un bottone con evento
$btn1 = New-Object System.Windows.Forms.Button -Property @{
    Location = New-Object System.Drawing.Point 20, 20    # definisco la posizione nel form
    Size     = New-Object System.Drawing.Size 150, 30    # definisco le dimensioni del pulsante
    Text     = "Cliccami"    # definisco il testo del pulsante
}
$btn1.Add_Click($HandleClick) # aggiungo l'evento sul click
$form.Controls.Add($btn1)    # importante: aggiungo il bottone alla form

#creo una label
$lbl1 = New-Object System.Windows.Forms.Label -Property @{
    Location  = New-Object System.Drawing.Point 20, 70
    Size      = New-Object System.Drawing.Size 250, 30
    Text      = "-"    # testo della label
    #ForeColor = "#ff0000"
    #BackColor = "#eeee00"
    #TextAlign = [System.Drawing.ContentAlignment]::MiddleCenter
    #Font      = [System.Drawing.Font]::new("Microsoft Sans Serif", 16.0, [System.Drawing.FontStyle]::Bold)
}
$form.Controls.Add($lbl1)    # aggiungo la label alla form

# bottone di chiusura form
$btn2 = New-Object System.Windows.Forms.Button -Property @{
    Location = New-Object System.Drawing.Point 20, 120
    Size     = New-Object System.Drawing.Size 150, 30
    Text     = "Chiudi"
    # lo imposto in modo che chiuda la finestra di dialogo
    DialogResult = [System.Windows.Forms.DialogResult]::Cancel
}
$form.Controls.Add($btn2)     # aggiungo il bottone alla form

#  visualizzo la form
$form.ShowDialog()

Il bottone btn1 gestisce anche l'evento click, aggiunto tramite il metodo Add_Click ($btn1.Add_Click($HandleClick)).
L'evento è definito all'inizio del codice e salvato in una variabile ($HandleClick).