Per quello che riguarda il primo quesito, la soluzione è molto semplice.
Il metodo FillRectangle ti consente di aggiungere quello che tu hai definito il "bordo bianco", mentre il testo lo aggiungi avvalendoti del metodo DrawString.

La faccenda si complica per la compressione.
Devi utilizzare un altro overload del metodo Save.
Devi inoltre recuperare la struttura ImageCodecInfo relativa al MIME Type.
Sfortunatamente, per fare ciò devi enumerare tutti gli image encoders e trovare quello corrispondente al MIME Type.
Ti mostro un pò di codice:

codice:
public void BuildImage(string sourcePath, string destPath, string mimeType)
{
    Bitmap bitmap = new Bitmap(sourcePath);
    Graphics graphic = Graphics.FromImage(bitmap);

    // Creo il rettangolo che conterrà il testo
    graphic.FillRectangle(new SolidBrush(Color.White), 0, 0, bitmap.Width, 10);

    // Creo il testo all'interno del rettangolo
    graphic.DrawString("Sample Text", new Font(FontFamily.GenericSerif, 6), new SolidBrush(Color.Black), 0, 0);

    // Compressione 40:1
    EncoderParameters encoderParams = new EncoderParameters(1);
    System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.Quality;
    EncoderParameter paramRatio = new EncoderParameter(encoder, 40L);
    encoderParams.Param[0] = paramRatio;

    // Per salvare l'immagine, nel caso della compressione, devi utilizzare un differente overload
    bitmap.Save(destPath, GetEncoderInfo(mimeType), encoderParams);
}

/// <summary>
/// Ottiene la struttura ImageCodecInfo relativa al tipo di immagine.
/// </summary>
private ImageCodecInfo GetEncoderInfo(string mimeType)
{
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
    for (int i = 0; i < encoders.Length; i++)
        if (encoders[i].MimeType.Equals(mimeType))
            return encoders[i];

    return null;
}
Se vuoi approfondire, dai un'occhiata al seguente link:
Working with Images in the .NET Framework