¿Hay alguna razón por la que no utilice una función en lugar de un procedimiento?
CREATE OR REPLACE FUNCTION ListadoClientes() RETURN sys_refcursor
IS
resul Sys_refcursor;
BEGIN
OPEN resul for select ID ,NOMBRES ,APELLIDOS ,CEDULA ,DIRECCION ,TELEFONO
from cliente;
RETURN resul;
END ListadoClientes;
Luego en C# debes cambiarlo a esto:
cmd.Parameters.Add("resul", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
Cuando ejecuta da.Fill(ds);
luego se ejecuta la función, es decir, usando cmd.ExecuteNonQuery();
ejecuta la función dos veces.
De todos modos, para un trámite la forma correcta debería ser esta:
cmd.CommandText = "ListadoClientes(:resul)";