There are several points that is possible to improve.

If you are working at least with [C#][1] 2.0 (as I expect because you mentioned `Nullable<decimal>`), you could replace `ArrayList` with `List<Ingredient>` or even `IEnumerable<Ingredient>`. This will make it more intuitive, and later you could remove type casting from `SumPercentages`.

    foreach (Ingredient ig in f.Ingredients)
    {
        SumOfPercentages += ig.Percentage;
    }

Then, if you are working at least with C# 3.0 you could, rewrite `SumPercentages` using LINQ:

    public void SumPercentages(Formula f)
    {
        f.SumPercentages = f.Ingredients.Select(ig => ig.Percentage).Sum();
    }

Last point, to implement `ICloneable` for both `Formula` and `Ingredient`, then replace 

    this.Ingredients = _Ingredients;

with

    this.Ingredients = Ingredients.Select(ig => ig.Clone()).ToList();

So `Ingredients` will be a copy of the initial array. This will prevent a situation when you unwittingly change the list of ingredients after you have created `Formula`.

  [1]: http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29